MySQL에서 실행중인 쿼리의 ID를 확인하고 쿼리를 강제 종료하는 방법

MySQL에서 실행중인 쿼리의 ID를 확인하고 쿼리를 강제 종료하는 방법

MySQL에서 실행중인 쿼리의 ID를 확인하고 쿼리를 강제 종료하는 방법과 종료 할 때 알아두어야 할 점에 대한 블로그입니다.
Clock Icon2023.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 DA부 송영진입니다. 오늘은 MySQL에서 실행중인 쿼리를 확인하는 방법과 종료하는 방법에 대해서 알아보도록 하겠습니다.

MySQL에서 무거운 쿼리를 실행했는데 한참 기다려도 반응이 없어서 강제종료해버리고 싶다! 라는 케이스가 몇 번이고 있으실거라 생각합니다. 물론 저도 그러한 경우가 많기 때문에 매번 어떻게 했더라... 하면서 찾아보고 있기 때문에 이번에 정리해보도록 하려고 합니다.

별로 어려운 방법은 아니니까 빠르게 알아보도록 하겠습니다.

실행중인 쿼리를 확인하기

show processlist;

간단한 명령어를 실행하면 다음과 같은 결과가 돌아옵니다.

+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| Id   | User | Host   | db      | Command | Time | State        | Info                                  |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| 1111 | root | xxxxxx | test_db | Query   | 2525 | Sending data | insert into test_db.test_target_table
select
    *
from
    test_table_source s |
| 1115 | root | xxxxxx | NULL    | Query   |    0 | starting     | show processlist                      |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+

쿼리가 점유하고 있는 테이블이 있는지 확인하기

사용중인 테이블이 있는지 확인하는 것도 간단한 쿼리로 가능합니다.

show open tables where in_use>0;

위의 쿼리를 실행하면 다음과 같은 결과로 어떤 테이블이 지금 사용 중에 있는지 확인이 가능합니다.

+----------+-------------------+--------+-------------+
| Database | Table             | In_use | Name_locked |
+------------+-----------------+--------+-------------+
| test_db  | test_target_table |      1 |           0 |
+----------+-------------------+--------+-------------+

 

ID로 실행중인 쿼리 강제종료하기

조금전에 실행중인 프로세스를 확인하는 쿼리의 결과가 있었습니다.

+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| Id   | User | Host   | db      | Command | Time | State        | Info                                  |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| 1111 | root | xxxxxx | test_db | Query   | 2525 | Sending data | insert into test_db.test_target_table
select
    *
from
    test_table_source s |
| 1115 | root | xxxxxx | NULL    | Query   |    0 | starting     | show processlist                      |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+

여기에서 보이는 Id 칼럼의 항목이 프로세스의 ID가 되겠습니다. 이 ID를 종료하는 쿼리를 실행하게되면 쿼리를 중지하는 동작으로 들어가게 됩니다. 명령어는 다음과 같습니다.

 
kill 1111;

만약 쿼리의 강제종료가 바로 이루어졌다면 프로세스 리스트에서 사라지게 됩니다.

+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| Id   | User | Host   | db      | Command | Time | State        | Info                                  |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+
| 1119 | root | xxxxxx | NULL    | Query   |    0 | starting     | show processlist                      |
+------+------+--------+---------+---------+------+--------------+---------------------------------------+

**중요**  **최중요**

여기서 중요하게 알아두셔야 할 점이 있습니다.

저희가 처음에 어떤 케이스에서 쿼리 종료의 필요성을 느낀다고 했었죠?

MySQL에서 무거운 쿼리를 실행했는데 한참 기다려도 반응이 없어서 강제종료해버리고 싶다!

바로 위와 같은 케이스였습니다.

중요하게 알아두셔야 할 점은 바로... 이 무거운 쿼리를 종료해버리고 싶지만 무거운 쿼리는 보통 종료하는데도 시간이 무지막지하게 걸린다. 입니다.

강제 종료한다고 그 쿼리가 바로 종료가 되는게 아닙니다... 오히려 실행한 쿼리의 강제 종료보다 정상적인 완료가 더 빠를 때도 있습니다...

그러니 지금 종료하고 싶은 쿼리가 앞으로 얼마나 남았을지 얼만큼이면 끝날 것 같은지를 잘 생각해보시고 kill 명령어를 사용하시길 추천합니다.

 

마지막으로

MySQL에서 실행중인 쿼리를 확인하는 방법과 종료하는 방법에 대하여 알아보았는데요 중요한 점은 무거운 쿼리는 바로 종료가 되지 않는다는 것이었습니다. 저도 이러한 이유 때문에 몇 시간동안 쿼리의 종료를 기다린 적이 있는데요, 그냥 서버를 꺼버리고 싶었습니다... 하지만 어쩔 수 없이 한참을 기다리게 되어버렸으니 여러분들도 평소에 이쯤이면 끝날 쿼리인데 왜 아직도 안끝나지? 종료시켜버릴까? 하고 고민이 되실 때에는 고민을 잘 하시고 결정을 하시길 바랍니다.

조금이라도 도움이 되셨길 바라면서 오늘은 여기서 마치겠습니다 감사합니다!

 

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.